﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using Sistema_Totem.Datos.ClasesDominio;


namespace Sistema_Totem.Datos.SqlServer
{
     /// <summary>
    /// Esta clase contiene cada uno de los metodos que tienen interaccion con la BD haciendo
    /// referencia o utilizando la entidad Propuesta
    /// </summary>   
    public class SqlServerPropuesta
    {

        #region Atributos

        Conexion enlace = new Conexion();

        #endregion Atributos

        #region Borrar Contenido

        /// <summary>
        /// Metodo encargado de borrar el contenido de la propuesta sin 
        /// modificar la configuracion incial de la plantilla que utiliza
        /// </summary>
   
        public bool EliminarContenidoPropuesta(int propuesta)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
          
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[EliminarContenido]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idPropuesta",propuesta);
                command.Parameters["@idPropuesta"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();

                return true;
            }

            catch (SqlException)
            {
                return false;
            }

            catch (Exception)
            {
                return false;
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Borrar Contenido

        #region Borrar Propuesta

        /// <summary>
        /// Metodo encargado de eliminar el documento de propuesta  
        /// para un proyecto particular
        /// </summary>

        public bool EliminarPropuestaProyecto(int propuesta)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            SqlServerPropuesta acceso = new SqlServerPropuesta();
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[EliminarPropuesta]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado

                //Entrada
                command.Parameters.AddWithValue("@idPropuesta", propuesta);
                command.Parameters["@idPropuesta"].Direction = ParameterDirection.Input;

                //Salida
                command.Parameters.AddWithValue("@idProyecto", SqlDbType.Int);
                command.Parameters["@idProyecto"].Direction = ParameterDirection.Output;

                reader = command.ExecuteReader();

                //Se captura identificador del proyecto al que pertenecia la Propuesta
                int proyecto = (int)command.Parameters["@idProyecto"].Value;

                bool auxiliar= false;

                if (acceso.EliminarContenidoPropuesta(propuesta))
                {                   
                    auxiliar= acceso.RestablecerPlantillaPropuesta(proyecto);                
                    
                }
                return auxiliar;
            }

            catch (SqlException)
            {
                return false;
            }

            catch (Exception)
            {
                return false;
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Borrar Propuesta

        #region Borrar Plantilla Personalizada

        /// <summary>
        /// Metodo encargado de eliminar las opciones (Secciones- Elementos) selecionadas  
        /// inicialmente de la plantilla de propuesta para el proyecto
        /// </summary>

        public bool RestablecerPlantillaPropuesta(int proyecto)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[EliminarConfiguracionPropuesta]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idProyecto", proyecto);
                command.Parameters["@idProyecto"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();

                return true;
            }

            catch (SqlException)
            {
                return false;
            }

            catch (Exception)
            {
                return false;
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Borrar Plantilla Personalizada

        #region Consultar Datos Plantilla Propuesta

        /// <summary>
        /// Incluye la informacion basica de la platilla asignada  
        /// para el documento propuesta del proyecto 
        /// </summary>
        /// 
        public Plantilla ConsultarPlantillaPropuesta(int idProyecto)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            Plantilla estructura = new Plantilla();
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[ConsultarPlantillaPropuesta]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idProyecto", idProyecto);
                command.Parameters["@idProyecto"].Direction = ParameterDirection.Input;

                reader = command.ExecuteReader();

                //se carga la informacion consultada de la Plantilla

                while (reader.Read())
                {
                    estructura.IdPlantilla = Convert.ToInt32(reader.GetDecimal(0));
                    estructura.NombrePlantilla = reader.GetString(1);
                    estructura.DescripcionPlantilla = reader.GetString(2);
                }
                return estructura;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception)
            {
                return null;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }

        #endregion Consultar Datos Plantilla Propuesta

        #region Consultar Propuesta de un Proyecto

        /// <summary>
        /// Metodo encargado de consultar secciones, elementos y contenido  
        /// que componen la propuesta de un proyecto particular
        /// </summary>
        /// 
        public Propuesta ConsultarPropuestaProyecto(int proyecto)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            Propuesta documento = new Propuesta();
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[ConsultarPropuestaProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idProyecto", proyecto);
                command.Parameters["@idProyecto"].Direction = ParameterDirection.Input;

                reader = command.ExecuteReader();

                //se carga la informacion basica de la Propuesta

                while (reader.Read())
                {
                    documento.IdPropuesta = reader.GetInt32(0);
                    documento.CodPropuesta = reader.GetString(1);
                }
                return documento;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception)
            {
                return null;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Consultar Propuesta de un Proyecto

        #region Consultar Secciones Particulares

        /// <summary>
        /// Metodo encargado de consultar las secciones seleccionadas por el  
        /// usuario de las disponibles para la plantilla de propuesta
        /// </summary>
        /// 
        public List<Seccion> ConsultarSeccionesPlantillaPropuesta(int proyecto)
        {
  
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Seccion> sectores = new List<Seccion>();
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[ConsultarSeccionesParticulares]"; // Secciones de Plantilla Personalizada por Usuario
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idProyecto", proyecto);
                command.Parameters["@idProyecto"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();

                //Si el proyecto no tiene plantilla personalizada configurada se cargan las secciones completas
                //por lo que debo cambiar el Stored Procedure manteniendo la variable del proyecto
                if (reader.HasRows== false) 
                {
                    command.CommandText = "[dbo].[ConsultarSecciones]";
                    reader = command.ExecuteReader();
                }
                while (reader.Read())
                {
                    Seccion parte = new Seccion();
                    parte.IdSeccion = reader.GetInt32(0);
                    parte.NombreSeccion = reader.GetString(1);

                    sectores.Add(parte);
                }
                return sectores;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception)
            {
                return null;
            }
            
            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Consultar Secciones Particulares

        #region Consultar Elementos Particulares

        /// <summary>
        /// Metodo encargado de consultar los elementos seleccionados por el  
        /// usuario para una seccion particular de la plantilla de propuesta
        /// </summary>
        /// 
        public List<Elemento> ConsultarElementosParticulares(int idSeccion, int idProyecto)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Elemento> campos = new List<Elemento>();
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[ConsultarElementosParticulares]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idProyecto", idProyecto);
               command.Parameters["@idProyecto"].Direction = ParameterDirection.Input;

                command.Parameters.AddWithValue("@idSeccion", idSeccion);
                command.Parameters["@idSeccion"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();

                //se carga la informacion consultada en una Lista de Elementos

                while (reader.Read())
                {
                    Elemento entrada = new Elemento();
                    entrada.IdElemento = Convert.ToInt32(reader.GetDecimal(0));
                    entrada.NombreElemento = reader.GetString(1);
                    entrada.ContenidoPredeterminado = reader.GetString(2);
                    entrada.Obligatoriedad = reader.GetString(3);
                    entrada.Orden = Convert.ToInt32(reader.GetDecimal(4));
                    entrada.TipoElemento = reader.GetString(5);

                    campos.Add(entrada);
                }
                return campos;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception)
            {
                return null;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Consultar Elementos Particulares

        #region Consultar Atributos segun Tipo de Elemento 

        /// <summary>
        /// Metodo encargado de consultar los atributos y el valor que toman  
        /// cada uno de los elementos que forman los elementos
        /// </summary>
        /// 
        public List<Atributo> ConsultarAtributos(int tipoElemento)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Atributo> detalles = new List<Atributo>();
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[ConsultarAtributos]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idTipoElemento", tipoElemento);
                command.Parameters["@idTipoElemento"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();

                //se carga la informacion consultada para cada Tipo de Elemento

                while (reader.Read())
                {
                    Atributo propiedad = new Atributo();
                    propiedad.Nombre = reader.GetString(0);
                    propiedad.Valor = reader.GetString(1);
                    detalles.Add(propiedad);
                }
                return detalles;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception)
            {
                return null;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Consultar Atributos segun Tipo de Elemento

        #region Consultar Ultima Propuesta

        /// <summary>
        /// Metodo encargado de insertar la propuesta particular de un proyecto  
        /// </summary>
        /// 
        public int ConsultarUltimaPropuesta()
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[UltimaPropuesta]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado

                command.Parameters.AddWithValue("@ultimo", SqlDbType.Int);
                command.Parameters["@ultimo"].Direction = ParameterDirection.Output;

                reader = command.ExecuteReader();

                //Se captura identificador de la Ultima Propuesta Insertada
                int documento = (int)command.Parameters["@ultimo"].Value;

                return documento;
            }
            catch (SqlException)
            {
                return -1;
            }
            catch (Exception)
            {
                return -1;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Consultar Ultima Propuesta

        #region Verificar si el Proyecto tiene Propuesta

        /// <summary>
        /// Metodo que verifica si el proyecto a consultar tiene 
        /// una propuesta creada
        /// </summary>
        /// 
        public bool VerificarPropuesta(int proyecto)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[ConsultarPropuestaProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idProyecto", proyecto);
                command.Parameters["@idProyecto"].Direction = ParameterDirection.Input;

                reader = command.ExecuteReader();            

                if (reader.HasRows == false)
                    return false;
                else
                    return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Verificar si el Proyecto tiene Propuesta 

        #region Verificar si el Proyecto tiene Plantilla Configurada 

        /// <summary>
        /// Metodo que verifica si el proyecto a consultar ya tiene 
        /// una configuracion particular para la plantilla de propuesta
        /// </summary>
        /// 
        public bool VerificarConfiguracionPropuesta(int idProyecto)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[ConsultarSeccionesParticulares]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idProyecto", idProyecto);
                command.Parameters["@idProyecto"].Direction = ParameterDirection.Input;

                reader = command.ExecuteReader();

                if (reader.HasRows == false)
                    return false;
                else
                    return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Verificar si el Proyecto tiene Plantilla Configurada

        #region Agregar Secciones Particulares

        /// <summary>
        /// Metodo encargado de insertar las secciones seleccionadas por el  
        /// usuario para una plantilla de propuesta
        /// </summary>
        /// 
        public bool InsertarSeccion(int proyecto, int seccion, int orden)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[InsertarSeccionPropuesta]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idProyecto", proyecto);
                command.Parameters["@idProyecto"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@idSeccion", seccion);
                command.Parameters["@idSeccion"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@posicion", orden);
                command.Parameters["@posicion"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();

               
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Agregar Secciones Particulares

        #region Agregar Propuesta

        /// <summary>
        /// Metodo encargado de insertar la propuesta particular de un proyecto  
        /// </summary>
        /// 
        public int InsertarPropuesta(string codigo)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[InsertarPropuesta]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado

                //Entrada
                command.Parameters.AddWithValue("@codigo", codigo);
                command.Parameters["@codigo"].Direction = ParameterDirection.Input;

                //Salida
                command.Parameters.AddWithValue("@ultimo", SqlDbType.Int);
                command.Parameters["@ultimo"].Direction = ParameterDirection.Output;

                reader = command.ExecuteReader();

                //Se captura identificador de la Nueva Propuesta Insertada
                int documento = (int)command.Parameters["@ultimo"].Value;

                return documento;
            }
            catch (SqlException)
            {
                return -1;
            }
            catch (Exception)
            {
                return -1;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Agregar Propuesta

        #region Agregar Elementos Particulares 

        /// <summary>
        /// Metodo encargado de insertar la combinacion particular seleccionada
        /// por el usuario de los elementos de la plantilla de propuesta
        /// </summary>
        /// 
        public bool InsertarElementoPropuesta(int proyecto, List<int> elementos)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[InsertarElementoPropuesta]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado

                command.Parameters.AddWithValue("@idProyecto", proyecto);
                command.Parameters["@idProyecto"].Direction = ParameterDirection.Input;

                //Insertando cada elemento seleccionado para la plantilla personalizada
                foreach (int elemento in elementos)
                {
                    command.Parameters.AddWithValue("@idElemento", elemento);
                    command.Parameters["@idElemento"].Direction = ParameterDirection.Input;
                    reader = command.ExecuteReader();
                }
                
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Agregar Elementos Particulares

        #region Guardar Contenido de Propuesta

        /// <summary>
        /// Metodo encargado de insertar la combinacion particular seleccionada
        /// por el usuario de los elementos de la plantilla de propuesta
        /// </summary>
        /// 
        public bool InsertarContenidoPropuesta(int proyecto, int propuesta, List<Elemento> campos)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[InsertarContenidoPropuesta]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado

                command.Parameters.AddWithValue("@idProyecto", proyecto);
                command.Parameters["@idProyecto"].Direction = ParameterDirection.Input;

                command.Parameters.AddWithValue("@idPropuesta", propuesta);
                command.Parameters["@idPropuesta"].Direction = ParameterDirection.Input;

                //Insertando el contenido por cada elemento de la plantilla personalizada
                foreach (Elemento _campo in campos)
                {
                    command.Parameters.AddWithValue("@idElemento", _campo.IdElemento);
                    command.Parameters["@idElemento"].Direction = ParameterDirection.Input;

                    command.Parameters.AddWithValue("@contenido", _campo.Contenido);
                    command.Parameters["@idElemento"].Direction = ParameterDirection.Input;

                    reader = command.ExecuteReader();
                }

                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Guardar Contenido de Propuesta

       
    }
}

